<script>
import { formatDate } from '@/utils/utils'
export default {
  data() {
    return {
      nextNotificationId: null // 存储下一个通知的ID
    }
  },
  onLaunch() {
    // 初始化时清除所有通知（使用替代方案）
    this.clearAllNotifications()
    this.checkNotificationPermission()
  },
  onShow() {
  },
  onHide() {
    if (this.firsLogin === 'firsLogin') {
      uni.clearStorageSync()
    }
  },
  computed: {
  },
  onUnload() {
  },
  methods: {
    // 权限引导
    showPermissionGuide() {
      uni.showModal({
        title: '需要通知权限',
        content: '请在系统设置中开启通知权限，以确保及时接收用药提醒',
        confirmText: '去设置',
        success: res => {
          if (res.confirm) {
            // #ifdef APP-PLUS
            plus.runtime.openSettings() // 打开应用设置
            // #endif
          }
        }
      })
    },
    // 获取通知数据（替换为实际 API 调用）
    getNotificationData() {
      return [
        { 'id': 2786, 'content': '香砂六君丸 每日3次，每次8丸', 'time': '07:00:00' },
        { 'id': 2786, 'content': '香砂六君丸 每日3次，每次8丸', 'time': '12:00:00' },
        { 'id': 2786, 'content': '香砂六君丸 每日3次，每次8丸', 'time': '18:00:00' },
        { 'id': 2796, 'content': '清胃黄连丸 每日2次，每次1丸', 'time': '08:00:00' },
        { 'id': 2796, 'content': '清胃黄连丸 每日2次，每次1丸', 'time': '12:30:00' },
        { 'id': 2796, 'content': '清胃黄连丸 每日2次，每次1丸', 'time': '15:17:00' },
        { 'id': 2806, 'content': '清热祛湿颗粒 每日2次，每次1袋', 'time': '16:56:00' }
      ]
    },
    // 清除所有通知
    clearAllNotifications() {
      // 如果有存储的通知ID，取消它
      if (this.nextNotificationId) {
        this.cancelNotification(this.nextNotificationId)
        this.nextNotificationId = null
      }
    },
    // 取消单个通知
    cancelNotification(id) {
      // #ifdef APP-PLUS
      if (uni.cancelPushMessage) {
        uni.cancelPushMessage({ id })
      }
      // #endif
    },
    setupMedicationReminders() {
      try {
        this.$u.api.getNotice({ beginDate: formatDate(), endDate: formatDate() }).then(res => {
          if (res.code === 200) {
            // 获取后端通知数据（实际开发中替换为API调用）
            const notifications = res.data.pageItems
            // const notifications = this.getNotificationData()
            // 获取当前时间
            const now = new Date()
            const currentTime = this.formatTime(now)
            // 找到第一条超过当前时间的通知
            const nextReminder = this.findNextReminder(notifications, currentTime)
            if (nextReminder) {
              const delaySeconds = this.calculateDelay(nextReminder.time, now)
              // 只设置这一条通知
              this.scheduleNotification(nextReminder, delaySeconds)
            }
          }
        })
      } catch (err) {
        console.error('获取通知列表失败:', err)
      }
    },
    formatTime(date) {
      const hours = date.getHours().toString().padStart(2, '0')
      const minutes = date.getMinutes().toString().padStart(2, '0')
      const seconds = date.getSeconds().toString().padStart(2, '0')
      return `${hours}:${minutes}:${seconds}`
    },
    // 找到第一条超过当前时间的通知
    findNextReminder(notifications, currentTime) {
      // 按时间升序排序
      const sortedNotifications = [...notifications].sort((a, b) =>
        a.time.localeCompare(b.time)
      )
      // 找到第一条超过当前时间的通知
      for (const notification of sortedNotifications) {
        if (notification.time > currentTime) {
          return notification
        }
      }
      // 如果没有找到，返回第二天的第一条通知
      return sortedNotifications.length > 0 ? sortedNotifications[0] : null
    },
    // 精确计算延迟时间（秒）
    calculateDelay(targetTime, currentDate) {
      const [targetHours, targetMinutes, targetSeconds] = targetTime.split(':').map(Number)
      // 创建目标时间对象
      const targetDate = new Date(currentDate)
      targetDate.setHours(targetHours, targetMinutes, targetSeconds, 0)
      // 如果目标时间已过，设置为明天
      if (targetDate <= currentDate) {
        targetDate.setDate(targetDate.getDate() + 1)
      }
      // 计算精确到毫秒的延迟
      return Math.floor((targetDate - currentDate) / 1000)
    },
    // 设置通知（Android 息屏通知）
    scheduleNotification(reminder, delaySeconds) {
      // 确保延迟时间合理
      if (delaySeconds <= 0) return
      // 清除之前的通知
      this.clearAllNotifications()
      // 生成唯一通知ID（基于内容和时间）
      const notificationId = `next_reminder_${Date.now()}`
      uni.createPushMessage({
        id: notificationId, // 设置唯一ID
        title: '用药提醒',
        content: reminder.content,
        delay: delaySeconds,
        showInForeground: false, // 关闭前台通知
        android: {
          channelId: 'medication_reminder',
          importance: 'high',
          visibility: 'public',
          onlyAlertOnce: true // 关键：仅提醒一次
        },
        success: () => {
          console.log(`通知设置成功: ${reminder.time} - ${reminder.content}`)
          // 存储通知ID以便后续管理
          this.nextNotificationId = notificationId
          // 设置一个定时器，在通知触发后重新设置下一个通知
          setTimeout(() => {
            this.setupMedicationReminders()
          }, delaySeconds * 1000 + 1000) // 通知触发后1秒重新检查
        },
        fail: (err) => {
          console.error('通知设置失败:', err)
        }
      })
    },
    checkNotificationPermission() {
      // #ifdef APP-PLUS
      const main = plus.android.runtimeMainActivity()
      let isEnabled = false
      if (plus.os.name === 'Android') {
        try {
          const NotificationManagerCompat = plus.android.importClass('androidx.core.app.NotificationManagerCompat')
          const nm = NotificationManagerCompat.from(main)
          isEnabled = nm.areNotificationsEnabled()
        } catch (e) {
          console.warn('使用兼容方案检测:', e)
          const sdkVersion = plus.android.importClass('android.os.Build$VERSION').SDK_INT
          if (sdkVersion >= 24) {
            const nm = main.getSystemService('notification')
            const method = nm.getClass().getMethod('areNotificationsEnabled')
            isEnabled = method.invoke(nm)
          }
        }
      }
      const isIOSAuthorized = plus.push.getClientInfo().permission === 'allowed'
      if ((plus.os.name === 'iOS' && !isIOSAuthorized) ||
      (plus.os.name === 'Android' && !isEnabled)) {
        this.showPermissionDialog()
      } else {
        this.setupMedicationReminders()
      }
      // #endif
    },
    showPermissionDialog() {
      uni.showModal({
        title: '温馨提示',
        content: '为确保及时接收重要通知，请开启通知权限',
        confirmText: '去设置',
        success: (res) => {
          if (res.confirm) {
            this.openAppSettings()
          }
        }
      })
    },
    openAppSettings() {
      // #ifdef APP-PLUS
      if (plus.os.name === 'iOS') {
        const UIApplication = plus.ios.import('UIApplication')
        const application = UIApplication.sharedApplication()
        const NSURL = plus.ios.import('NSURL')
        const settingsUrl = NSURL.URLWithString(UIApplication.openSettingsURLString)
        application.openURL(settingsUrl)
        plus.ios.deleteObject(settingsUrl)
        plus.ios.deleteObject(NSURL)
        plus.ios.deleteObject(UIApplication)
      } else if (plus.os.name === 'Android') {
        const Intent = plus.android.importClass('android.content.Intent')
        const Settings = plus.android.importClass('android.provider.Settings')
        const main = plus.android.runtimeMainActivity()
        const intent = new Intent()
        intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS)
        intent.putExtra(Settings.EXTRA_APP_PACKAGE, main.getPackageName())
        main.startActivity(intent)
        this.setupMedicationReminders()
      }
      // #endif
    }
  }
}
</script>

<style lang="scss">
  // iconfont
  @import "@/static/font/iconfont.css";
	// 每个页面公共css
  uni-page-body{
    height: 100%;
  }
</style>
